mod cli;
mod db;
mod scanner;
mod error;

use anyhow::Result;
use cli::Cli;
use clap::Parser;

fn main() -> Result<()> {
    // 解析命令行参数
    let cli = Cli::parse();

    // 初始化数据库
    db::init_db()?;

    // 根据命令行参数执行不同的操作
    if cli.check {
        // 执行检查命令：检查数据库中的文件是否存在
        println!("开始检查数据库记录...");
        scanner::check_files()?;
    } else if cli.query {
        // 执行查询命令：查询重复文件
        println!("查询重复文件...");
        scanner::query_duplicate_files()?;
    } else if let Some(directory) = cli.directory {
        // 执行扫描命令：扫描指定目录的文件
        scanner::scan_directory(directory, cli.min_size, cli.workers)?;
    } else {
        // 没有指定任何操作，显示帮助信息
        eprintln!("错误: 必须指定一个操作");
        eprintln!("");
        eprintln!("使用示例:");
        eprintln!("  filescanner -d <目录> [-s <文件大小>] [-w <线程数>]  扫描目录文件");
        eprintln!("  filescanner -c                                     检查数据库中的文件");
        eprintln!("  filescanner -q                                     查询重复文件");
        eprintln!("");
        eprintln!("参数说明:");
        eprintln!("  -d, --directory <DIR>  指定要扫描的目录");
        eprintln!("  -s, --size <SIZE>      忽略小于指定大小的文件 (默认: 100k)");
        eprintln!("  -w, --workers <NUM>    指定工作线程数 (默认: CPU核心数的1.5倍)");
        eprintln!("  -c, --check            检查数据库中的文件是否存在");
        eprintln!("  -q, --query            查询MD5相同的文件");
        eprintln!("");
        eprintln!("使用 --help 查看完整帮助信息");
        std::process::exit(1);
    }

    Ok(())
}
